// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.sns_friend;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.widget.ARecyclerViewAdapter;
//import com.eva.android.widget.AsyncBitmapLoader;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rbchat.utils.IntentFactory;

import java.util.ArrayList;
import java.util.List;

import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 本类用于显示通过“查找好友”功能查到的数据结果。
 * <p>
 * <b>特别说明：</b>自v4.5版起，本界面中的列表已由原先的ListView实现改为了RecyclerView。
 *
 * @author Jack Jiang
 * @since 4.5
 */
public class FindFriendResultActivity2 extends DataLoadableActivity {
    private RecyclerView friendListView = null;
    private RecyclerViewLinearAdapter friendListViewAdapter = null;

    /** 布局：没有消息时的提示 */
    private LinearLayout llNoAlarms = null;
    /** 数据：列表要显示的数据集合(即数据模型) */
    private ArrayList<RosterElementEntity> friendInfoList = new ArrayList<>();

    /** 组件："换一批"按钮 */
    private Button btnRefresh = null;

    /** Intent传进来的参数： -1 - 表示不区分是否在线，1 - 表示只查在线，0 - 表示只查离线 */
    private String onlineStatusForInit;
    /** Intent传进来的参数：-1 - 表示不区分性别，1  - 表示只查男性，0 - 表示只查女性 */
    private String maleForInit;

    @Override
    protected void initDataFromIntent() {
        // 解析从intent中传过来的数据
        ArrayList intentDatas = IntentFactory.parseFriendInfoListIntent(getIntent());
//        friendInfoList = (ArrayList<RosterElementEntity>) intentDatas.get(0);
        onlineStatusForInit = (String)intentDatas.get(0);
        maleForInit = (String)intentDatas.get(1);
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
     */
    @Override
    protected void initViews(Bundle savedInstanceState) {
        customeTitleBarResId = R.id.sns_friend_list_form_titleBar;
        // 首先设置contentview
        setContentView(R.layout.sns_friend_result_list2);
        this.setTitle(R.string.sns_friend_list_form_title);

        // 自定义标题组件配置
        this.btnRefresh = this.getCustomeTitleBar().getRightGeneralButton();
        this.btnRefresh.setVisibility(View.VISIBLE);
        this.btnRefresh.setText("");
        this.btnRefresh.setBackgroundResource(R.drawable.common_title_btn_refresh_t);

        // 列表无数据时的UI提示信息组件
        llNoAlarms = (LinearLayout)findViewById(R.id.sns_friend_list_form_noAlarmsLL);
        // 列表对象
        friendListView = (RecyclerView) findViewById(R.id.sns_friend_list_form_listView);

        // 对列表对象进行相关初始化
        this._initRecyclerView();

//        this.setLoadDataOnCreate(false);
    }

    private void _initRecyclerView() {
        // 使RecyclerView保持固定的大小,这样会提高RecyclerView的性能
        friendListView.setHasFixedSize(true);

        //设置分割线（使用官方的一个默认实现，不然自已来画就太烦了）
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        dividerItemDecoration.setDrawable(
                ContextCompat.getDrawable(this, R.drawable.sns_find_friend_result_recyclerview_divider2));
        friendListView.addItemDecoration(dividerItemDecoration);

        // 设置线性布局管理器
        friendListView.setLayoutManager(new LinearLayoutManager(this));

        // 实例化Adapter
        friendListViewAdapter = new RecyclerViewLinearAdapter(this, new ARecyclerViewAdapter.OnItemClickListener() {
            // 列表点击事件的处理代码
            public void onItemClick(int position) {
                RosterElementEntity friendInfo = friendInfoList.get(position);
                if(friendInfo != null) {
                    FindFriendResultActivity2.this.startActivity(
                            IntentFactory.createFriendInfoIntent(FindFriendResultActivity2.this, friendInfo));
                }
            }
        });

        // 设置Adapter
        friendListView.setAdapter(friendListViewAdapter);

        // 强制刷新显示（目的是触发内容改变并通知观察者）
        friendListViewAdapter.notifyDataSetChanged();
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners() {
        this.btnRefresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(FindFriendResultActivity2.this)
                        .setTitle($$(R.string.general_prompt))
                        .setMessage($$(R.string.find_result_refresh))
                        .setPositiveButton($$(R.string.general_ok),  new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialog,int which) {
                                loadData();
                            }
                        })
                        .setNegativeButton($$(R.string.general_cancel), null)
                        .show();
            }
        });
    }

    @Override
    protected DataFromServer queryData(String... params) {
        return HttpRestHelper.submitGetRandomFindFriendsToServer(
                MyApplication.getInstance(this).getIMClientManager().getLocalUserInfo().getUser_uid()
                , maleForInit
                , onlineStatusForInit);
    }

    @Override
    protected void refreshToView(Object jsonOfResultToView) {
        if (jsonOfResultToView != null) {
            ArrayList<RosterElementEntity> friendInfo =
                    HttpRestHelper.parseGetRandomFindFriendsFromServer((String)jsonOfResultToView);

            // 用新查到的数据刷新界面显示
            this.friendInfoList = (friendInfo == null? new ArrayList<RosterElementEntity>(): friendInfo);
            this.friendListViewAdapter.setListData(this.friendInfoList);

            // 强制刷新列表的UI显示（目的是触发内容改变并通知观察者）
            this.friendListViewAdapter.notifyDataSetChanged();
        } else {
            new AlertDialog.Builder(this)
                    .setTitle(this.getResources().getString(R.string.general_prompt))
                    .setMessage($$(R.string.fint_result_no_result))
                    .setPositiveButton($$(R.string.general_ok), null)
                    .show();
        }
    }

    /**
     * 数据列表RecyclerView的Adapter实现类。
     */
    private class RecyclerViewLinearAdapter extends ARecyclerViewAdapter<RosterElementEntity> {

//        /** 图片缓存实现类，提高列表的图片管理性能 */
//        private AsyncBitmapLoader asyncLoader = null;

        public RecyclerViewLinearAdapter(Activity context, OnItemClickListener onItemClickListener) {
            super(context, R.layout.sns_friend_result_list_item2, onItemClickListener);
//            this.asyncLoader = new AsyncBitmapLoader(AvatarHelper.getUserAvatarSavedDir(context)+"/");
        }

        /**
         * 列表adapter数据结构创建方法.
         * 子类可覆盖此方法用以实现自已的数据结构.
         *
         * @return
         */
        @Override
        protected List<RosterElementEntity> createListData() {
            return friendInfoList;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new LinearViewHolder(layoutInflater.inflate(itemResId, parent,false));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
            // 别忘了调用父类方法
            super.onBindViewHolder(viewHolder, position);

            // 正在操作的viewHolder对象
            LinearViewHolder holder = (LinearViewHolder)viewHolder;
            // 正在操作的列表行的数据集
            final RosterElementEntity rowData = listData.get(position);

            // 设置昵称
            holder.viewNikcName.setText(rowData.getNickNameWithRemark());

            // 如果用户的个人签名为空，就显示它的UID，否则显示内容为它的个人签名
            if(!CommonUtils.isStringEmpty((String)rowData.getWhatsUp(),true)) {
                holder.viewUserUidLabel.setVisibility(View.GONE);
                holder.viewUserUid.setText((String)rowData.getWhatsUp());
            }
            else {
                holder.viewUserUidLabel.setVisibility(View.VISIBLE);
                holder.viewUserUid.setText(rowData.getUser_uid());
            }

            // 默认头像
            holder.viewAdavar.setImageResource(R.drawable.default_avatar_yuan_50_3x);

            // 设置用户在线状态flg
            holder.viewOnlineFlag.setVisibility(rowData.isOnline()?View.VISIBLE:View.GONE);
            holder.viewOfflineFlag.setVisibility(rowData.isOnline()?View.GONE:View.VISIBLE);

            // 设置用户性能flag
            holder.viewSexManFlag.setVisibility(rowData.isMan()?View.VISIBLE:View.GONE);
            holder.viewSexWomanFlag.setVisibility(rowData.isMan()?View.GONE:View.VISIBLE);

            // 根据Glide官方指南的说明：https://muyangmin.github.io/glide-docs-cn/doc/getting-// 以下代码，解决Glide在RecycleView中图片错位或重复显示问题
            Glide.with(context).clear(holder.viewAdavar);// 解决方法2
            // clear完成后设置默认占位图，确保图片显示不出现Glide导致的错位问题
            holder.viewAdavar.setImageResource(R.drawable.default_avatar_yuan_50_3x);

            // 异步加载用户头像：
            // userAvatarFileName中存放的中该人员的头像存放于服务端的文件名（也将原样用于本地的缓存文件名）为null即表示该人员没有头像
            if(!CommonUtils.isStringEmpty((String)rowData.getUserAvatarFileName(), true)) {
                ImageCacheLoader.loadAvatarImgWithGlide(context, rowData.getUser_uid(), rowData.getUserAvatarFileName()
                        , holder.viewAdavar
                        , 25 // 圆角单位是dp
                        , R.drawable.default_avatar_yuan_50_3x, false, false);

//                //根据图片URL去查找内存缓存有没有对应的Bitmap对象，并传递回调方法，如果没有，则等下载完毕回调
//                Bitmap bitmap = asyncLoader.loadBitmap(holder.viewAdavar
//                        // 注意：此下载地址在服务端的逻加上是不管客户有无缓存都会传过来头像文件数据的，但在此处却不需要顾及它，
//                        // 因为此处使用的缓存逻辑是独立的：它先判断本地用无该文件，如果没有的时候才会用此URL取头像数据，所以此
//                        // URL要一定能取的到头像数据就对了
//                        , AvatarHelper.getUserAvatarDownloadURL(context, rowData.getUser_uid())
//                        , (String)rowData.getUserAvatarFileName() //, rowData.getUserAvatarFileName()
//                        , new AsyncBitmapLoader.ImageCallBack()
//                        {
//                            @Override
//                            public void imageLoad(ImageView imageView, Bitmap bitmap)
//                            {
//                                // 从网络加载完成用户头像了
//                                imageView.setImageBitmap(bitmap);
//
//                                // 刷新列表以显示最新头像
//                                RecyclerViewLinearAdapter.this.notifyDataSetChanged();
//                            }
//                        }
//                        // 指定生成的Bitmap对象所描述的图片的大小(更小的尺寸将成倍地减小内存消耗)
//                        , 140 , 140 // 此头像用于列表中的用户头像，大小参考：sns_friend_list_form_list_item.xml中的@+id/sns_friend_list_form_item_nickname_imageView
//                );
//
//                // 取到头像缓存了，直接设置之
//                if(bitmap != null)
//                    holder.viewAdavar.setImageBitmap(bitmap);
            }
        }

        /**
         * 根据RecyclerView内容的变动，来决定无数据时的UI内容显示。
         */
        @Override
        protected void dataSetChanged(){
            if(this.getItemCount() <= 0) {
                llNoAlarms.setVisibility(View.VISIBLE);
                friendListView.setVisibility(View.GONE);
            }
            else {
                llNoAlarms.setVisibility(View.GONE);
                friendListView.setVisibility(View.VISIBLE);
            }
        }

        /**
         * ViewHolder实现类。
         */
        class LinearViewHolder extends RecyclerView.ViewHolder{

            private TextView viewNikcName = null;
            private TextView viewUserUid = null;
            private ImageView viewAdavar = null;
            private TextView viewUserUidLabel = null;

            private TextView viewSexManFlag = null;
            private TextView viewSexWomanFlag  = null;
            private TextView viewOnlineFlag = null;
            private TextView viewOfflineFlag = null;

            public LinearViewHolder(View itemView) {
                super(itemView);

                // item里的操作组件实例
                viewNikcName = (TextView) itemView.findViewById(R.id.sns_friend_list_form_item_nickname);
                viewUserUid = (TextView) itemView.findViewById(R.id.sns_friend_list_form_item_uid);
                viewAdavar = (ImageView)itemView.findViewById(R.id.sns_friend_list_form_item_nickname_imageView);
                viewUserUidLabel = (TextView)itemView.findViewById(R.id.sns_friend_list_form_item_uidLabel);

                viewSexManFlag = (TextView)itemView.findViewById(R.id.sns_friend_list_form_item_sexManFlagView);
                viewSexWomanFlag = (TextView)itemView.findViewById(R.id.sns_friend_list_form_item_sexWomanFlagView);
                viewOnlineFlag = (TextView)itemView.findViewById(R.id.sns_friend_list_form_item_statusOnlineFlagView);
                viewOfflineFlag = (TextView)itemView.findViewById(R.id.sns_friend_list_form_item_statusOfflineFlagView);
            }
        }
    }
}
